package com.otherTest.genericity;

import org.junit.Test;

import java.util.ArrayList;
import java.util.List;

/**
 * 泛型的一些基础了解
 *
 * @author Conceit
 * @since 1.0.0, 2017/8/16
 */
public class genericityStart {


    /**
     * 泛型的擦除
     * 在编译之后程序会采取去泛型化的措施。
     * 也就是说Java中的泛型，只在编译阶段有效。
     * 在编译过程中，正确检验泛型结果后，会将泛型的相关信息擦出，并且在对象进入和离开方法的边界处添加类型检查和类型转换的方法。
     * 也就是说，泛型信息不会进入到运行时阶段。
     */
    @Test
    public void genericity() {

        List<String> stringList = new ArrayList<String>();
        List<Integer> integerList = new ArrayList<Integer>();


        Class stringListClass = stringList.getClass();
        Class integerListClass = integerList.getClass();

        System.out.println(stringListClass);
        System.out.println(integerListClass);
    }

    /**
     * 泛型有三种使用方式，分别为：泛型类、泛型接口、泛型方法
     */


    /**
     * 泛型类
     */
    @Test
    public void genericityClass() {
        //调用泛型类
        //泛型的类型参数只能是类类型（包括自定义类）,不能是简单类型
        //实参类型需与泛型的类型参数类型相同，即为Integer.
        //调用构造方法传入的1 几位Integer类型
        GenericityClass<Integer> genericityClass = new GenericityClass<Integer>(1);
        System.out.println(genericityClass.getKey());

        //传入String
        //如果没有指定泛型 则类型默认为Object
        GenericityClass genericityClass1 = new GenericityClass<>(2);
        System.out.println(genericityClass1.getClass().getName());
        System.out.println(genericityClass1.getKey());

    }

    /**
     * 泛型方法
     */
    @Test
    public void genericityMethod() {

    }
}
